/*
 * Clase encargada de crear objetos tipo DLL para una
 * estructura de datos de tipo Lista doblemente enlazada.
 */
package fuente.estructuras;

public class DLL {
    
    private DLLNode _head,
                    _tail;
    private int _length;
    
    /**
     * El Constructor
     */
    public DLL () {
        _head = null;
        _tail = null;
        _length = 0;
    }

    /* Incio declaraciones de getters y setters */
    
    /**
     * Retorna el primer nodo de la lista.
     * @return El primer nodo
     */
    public DLLNode getHead() {
        return _head;
    }
    
    /**
     * Obtiene el largo de la lista.
     * @return el larrgo de la lista
     */
    public int getLength() {
        return _length;
    }

    /**
     * Establece una referencia al primer nodo de la lista.
     * @param pHead El primer nodo a establecer
     */
    public void setHead(DLLNode pHead) {
        _head = pHead;
    }
    
    /**
     * Establece una referencia al nodo siguiente del primer nodo de la lista.
     * @param element El elemento a insertar al nodo siguiente al primer nodo.
     */
    public void setPostHead(Object element) {
        DLLNode aux = new DLLNode(element);
        aux._succ = _head._succ;
        aux._pred = _head;
        _head._succ = aux;
        _head._succ._pred = aux;
        
    }
    
    /* Final declaraciones de getters y setters */
    /**
     * Inserta un nodo al final de la lista.
     * @param element elemento del nodo a insertar
     */
    public void insertar(Object element) {
        DLLNode nodoAInsertar = new DLLNode(element);
        if (_head == null) {
             _head = nodoAInsertar;
        }
        
        else {
            DLLNode tmp = _head;
            while (tmp.getSucc() != null) {
                tmp = tmp.getSucc();
            }            
        
            tmp.setSucc(nodoAInsertar);
            nodoAInsertar.setPred(tmp);
        }
        _length ++;
    }
    
     public void eliminaPorPosicion (int pCasillaPorEliminar){
        if(pCasillaPorEliminar == 1){
            _head._pred = null;
            _head = _head._succ;
        }
        else{
            int contador = 1;
            DLLNode temp = _head;
            while(contador +1 != pCasillaPorEliminar){
                temp = temp._succ;
                contador++;
            }
            if (contador +1 == _length){
                temp._succ = null;
                _tail = temp;                
            }
            else{
                temp._succ._succ._pred = temp;
                temp._succ = temp._succ._succ;
            }
        }
        _length--;
    }
     
     public int buscarYDarPosicion(Object pPorBuscar){
        int posicion = 1;
        for (DLLNode temp2 = _head; temp2 != null; temp2 = temp2._succ){
            if (temp2._data.equals(pPorBuscar) ){
                System.out.println("true, esta en la posicion es: " +posicion);
                return posicion;
            }
            posicion++;
        }
        System.out.println("false, no se encontró el elemento");
        return 0;
    }
    
    public void imprimir(){
        for(DLLNode aux = _head;aux != null;aux = aux._succ){
            System.out.print(aux._data+ ", ");            
        }
        System.out.println("");
        System.out.println("tamaño_lista = "+_length);
    }
}
